home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Languages / MacQForth 1.0 / source / QF Source / QF.REGWRDS1.S < prev    next >
Text File  |  1995-03-06  |  9KB  |  417 lines

  1. *
  2. * Word "r@" - Copy value from return stack to data stack
  3. *
  4.  
  5. WORD51 ASC 'r@ '
  6.  DW RFETCH
  7.  
  8. RFETCH JSR POPRETN
  9.  JSR PUSHRETN
  10.  JMP PUSHDATA
  11.  
  12. *
  13. * Word "." - Print out top number on stack as signed integer
  14. *
  15.  
  16. WORD52 ASC '. '
  17.  DW DOT
  18.  
  19. DOT JSR POPDATA
  20.  JMP PRTSIGND
  21.  
  22. *
  23. * Word "u." - print out top number on stack as unsigned int
  24. *
  25.  
  26. WORD53 ASC 'u. '
  27.  DW U_DOT
  28.  
  29. U_DOT JSR POPDATA
  30.  JMP PRTDEC
  31.  
  32. *
  33. * Word "not" - do logical NOT on top number
  34. *
  35. * Note: Bypasses POPDATA, PUSHDATA for speed
  36. *
  37.  
  38. WORD54 ASC 'not '
  39.  DW NOT
  40.  
  41. NOT LDA DATITEMS ; Make sure there's something on stack
  42.  BEQ :ERROR ;   to negate
  43.  
  44.  LDY DATSTACK
  45.  LDA DATAAREA+1,Y
  46.  ORA DATAAREA+2,Y
  47.  BNE :FALSE
  48.  LDA #$FF
  49.  HEX 2C ; BIT trick
  50. :FALSE LDA #00
  51.  STA DATAAREA+1,Y
  52.  STA DATAAREA+2,Y
  53.  RTS
  54.  
  55. :ERROR LDA #04 ; "Data stack underflow"
  56.  JMP PRTERR
  57.  
  58. *
  59. * Word "and" - perform logical AND on top two stack items
  60. *
  61.  
  62. WORD55 ASC 'and '
  63.  DW AND
  64.  
  65. AND JSR POPDATA
  66.  STY TEMP
  67.  TXA
  68.  ORA TEMP
  69.  STA TEMP
  70.  BEQ :FALSE
  71.  
  72.  JSR POPDATA
  73.  STY TEMP
  74.  TXA
  75.  ORA TEMP
  76.  STA TEMP
  77.  BEQ :FALSE2
  78.  
  79.  LDX #$FF
  80.  LDY #$FF
  81.  JMP PUSHDATA
  82.  
  83. :FALSE JSR POPDATA
  84. :FALSE2 LDX #$00
  85.  LDY #$00
  86.  JMP PUSHDATA
  87.  
  88. *
  89. * Word "or" - Perform logical OR on top two stack items
  90. *
  91.  
  92. WORD56 ASC 'or '
  93.  DW OR
  94.  
  95. OR JSR POPDATA
  96.  STY TEMP
  97.  TXA
  98.  ORA TEMP
  99.  STA TEMP
  100.  JSR POPDATA
  101.  TYA
  102.  ORA TEMP
  103.  STA TEMP
  104.  TXA
  105.  ORA TEMP
  106.  STA TEMP
  107.  BNE :TRUE
  108.  LDX #$00
  109.  LDY #$00
  110.  JMP PUSHDATA
  111.  
  112. :TRUE LDX #$FF
  113.  LDY #$FF
  114.  JMP PUSHDATA
  115.  
  116. *
  117. * Word "xor" - Do logical XOR on top two stack items
  118. *
  119.  
  120. WORD57 ASC 'xor '
  121.  DW XOR
  122.  
  123. XOR JSR POPDATA
  124.  STY TEMP
  125.  TXA
  126.  ORA TEMP
  127.  BEQ :ZERO
  128.  LDA #$FF
  129.  HEX 2C
  130. :ZERO LDA #$00
  131.  STA TEMP
  132.  
  133.  JSR POPDATA
  134.  STY TEMP2
  135.  TXA
  136.  ORA TEMP2
  137.  BEQ :ZERO2
  138.  LDA #$FF
  139.  HEX 2C
  140. :ZERO2 LDA #$00
  141.  EOR TEMP
  142.  TAY
  143.  TAX
  144.  JMP PUSHDATA
  145.  
  146. *
  147. * Word "+" - Add two numbers on stack,
  148. *            leave result on stack
  149. *
  150.  
  151. WORD58 ASC '+ '
  152.  DW ADD
  153.  
  154. ADD JSR POPDATA
  155.  STY TEMP
  156.  STX TEMP+1
  157.  JSR POPDATA
  158.  TYA
  159.  CLC
  160.  ADC TEMP
  161.  TAY
  162.  TXA
  163.  ADC TEMP+1
  164.  TAX
  165.  JMP PUSHDATA
  166.  
  167. *
  168. * Word "-" - Subtract top word from next-top word,
  169. *            leave result on stack
  170. *
  171.  
  172. WORD59 ASC '- '
  173.  DW MINUS
  174.  
  175. MINUS JSR POPDATA
  176.  STY TEMP
  177.  STX TEMP+1
  178.  JSR POPDATA
  179.  TYA
  180.  SEC
  181.  SBC TEMP
  182.  TAY
  183.  TXA
  184.  SBC TEMP+1
  185.  TAX
  186.  JMP PUSHDATA
  187.  
  188. *
  189. * Word "*" - Multiply two numbers on stack,
  190. *            leave result on stack (signed)
  191. *
  192.  
  193. WORD60 ASC '* '
  194.  DW ASTERISK
  195.  
  196. ASTERISK JSR GETNUMS ; Fetch two signed integers
  197.  
  198.  STZ TEMP
  199.  LDY #00
  200.  
  201.  LDX #16
  202. :LOOP LSR PNTR+1
  203.  ROR PNTR
  204.  BCC :SKIPADD
  205.  TYA
  206.  CLC
  207.  ADC PNTR2
  208.  TAY
  209.  LDA PNTR2+1
  210.  ADC TEMP
  211.  STA TEMP
  212. :SKIPADD ASL PNTR2
  213.  ROL PNTR2+1
  214.  DEX
  215.  BNE :LOOP
  216.  
  217.  LDX TEMP
  218.  BIT TEMP2 ; Check for negative
  219.  BPL :NOTNEG
  220.  
  221.  TYA
  222.  EOR #$FF
  223.  CLC
  224.  ADC #01
  225.  TAY
  226.  TXA
  227.  EOR #$FF
  228.  ADC #00
  229.  TAX
  230.  
  231. :NOTNEG JMP PUSHDATA
  232.  
  233. *
  234. * GETNUMS - subroutine for fetching two signed numbers
  235. *             (called by ASTERISK, SLASH, MOD)
  236. *
  237.  
  238. GETNUMS JSR POPDATA ; Get first number and store sign
  239.  TXA
  240.  BPL :POS
  241.  
  242.  LDA #$FF
  243.  STA TEMP2
  244.  TYA
  245.  EOR #$FF
  246.  CLC
  247.  ADC #01
  248.  STA PNTR
  249.  TXA
  250.  EOR #$FF
  251.  ADC #00
  252.  STA PNTR+1
  253.  BRA :MERGE
  254.  
  255. :POS STZ TEMP2
  256.  STY PNTR
  257.  STX PNTR+1
  258.  
  259. :MERGE JSR POPDATA ; Get second number and store sign
  260.  TXA
  261.  BPL :POS2
  262.  
  263.  LDA TEMP2
  264.  EOR #$FF ; Invert high bit of TEMP2
  265.  STA TEMP2
  266.  
  267.  TYA
  268.  EOR #$FF
  269.  CLC
  270.  ADC #01
  271.  STA PNTR2
  272.  TXA
  273.  EOR #$FF
  274.  ADC #00
  275.  STA PNTR2+1
  276.  RTS
  277.  
  278. :POS2 STY PNTR2
  279.  STX PNTR2+1
  280.  RTS
  281.  
  282. *
  283. * Word "/" - Divide two numbers on stack,
  284. *            leave result on stack
  285. *
  286.  
  287. WORD61 ASC '/ '
  288.  DW SLASH
  289.  
  290. SLASH JSR GETNUMS
  291.  
  292.  JSR DIVSUB
  293.  
  294.  LDY PNTR2
  295.  LDX PNTR2+1
  296.  BIT TEMP2
  297.  BPL :POSITIV
  298.  
  299.  TYA
  300.  EOR #$FF
  301.  CLC
  302.  ADC #01
  303.  TAY
  304.  TXA
  305.  EOR #$FF
  306.  ADC #00
  307.  TAX
  308.  
  309. :POSITIV JMP PUSHDATA
  310.  
  311. *
  312. * DIVSUB - subroutine for division
  313. *            (called by SLASH, MOD)
  314. *
  315.  
  316. DIVSUB LDA PNTR
  317.  ORA PNTR+1
  318.  BEQ :ERROR
  319.  STZ PNTR3
  320.  STZ PNTR3+1
  321.  
  322.  LDX #16
  323. :LOOP ASL PNTR2
  324.  ROL PNTR2+1
  325.  ROL PNTR3
  326.  ROL PNTR3+1
  327.  LDA PNTR3
  328.  SEC
  329.  SBC PNTR
  330.  TAY
  331.  LDA PNTR3+1
  332.  SBC PNTR+1
  333.  BCC :NOGOOD
  334.  STA PNTR3+1
  335.  STY PNTR3
  336.  LDA PNTR2
  337.  ORA #01
  338.  STA PNTR2
  339. :NOGOOD DEX
  340.  BNE :LOOP
  341.  
  342.  RTS
  343.  
  344. :ERROR LDA #$0E ; "Division by zero"
  345.  JMP PRTERR
  346.  
  347. *
  348. * Word "mod" - Divide two numbers on stack,
  349. *              leave modulus on stack
  350. *
  351.  
  352. WORD62 ASC 'mod '
  353.  DW MOD
  354.  
  355. MOD JSR POPDATA ; Get first number and ignore sign
  356.  TXA
  357.  BPL :POS
  358.  
  359.  TYA
  360.  EOR #$FF
  361.  CLC
  362.  ADC #01
  363.  STA PNTR
  364.  TXA
  365.  EOR #$FF
  366.  ADC #00
  367.  STA PNTR+1
  368.  BRA :MERGE
  369.  
  370. :POS STY PNTR
  371.  STX PNTR+1
  372.  
  373. :MERGE JSR POPDATA ; Get second number and store sign
  374.  TXA
  375.  BPL :POS2
  376.  
  377.  LDA #$FF
  378.  STA TEMP2
  379.  TYA
  380.  EOR #$FF
  381.  CLC
  382.  ADC #01
  383.  STA PNTR2
  384.  TXA
  385.  EOR #$FF
  386.  ADC #00
  387.  STA PNTR2+1
  388.  BRA :MERGE2
  389.  
  390. :POS2 STZ TEMP2
  391.  STY PNTR2
  392.  STX PNTR2+1
  393.  
  394. :MERGE2 JSR DIVSUB
  395.  
  396.  LDY PNTR3 ; Set sign of modulus to same as dividend
  397.  LDX PNTR3+1
  398.  BIT TEMP2
  399.  BPL :POSITIV
  400.  
  401.  TYA
  402.  EOR #$FF
  403.  CLC
  404.  ADC #01
  405.  TAY
  406.  TXA
  407.  EOR #$FF
  408.  ADC #00
  409.  TAX
  410.  
  411. :POSITIV JMP PUSHDATA
  412.  
  413. ********************************
  414. * End regular words 1
  415. ********************************
  416.